#include "semaf.h"

int crearSem(key_t clave){

	int id;

	if ((id=semget(clave, 1, (IPC_CREAT|0600))) == -1) {
		perror("Error al crear el sem�foro.");
		return(-1);
	}
return id;
}

int inicia(int valor, key_t clave)
{
int id;
union semun {
  int val;
  struct semid_ds *buf;
  ushort *array;
} estrucSem;

  id=crearSem(clave);

  estrucSem.val = valor;
  if (semctl(id, 0, SETVAL, estrucSem) == -1) {
    perror("Error al inicializar el semforo.");
    return (-1); /*error en inicializacion*/
  }
  return(id);
}

void down(int semaforo)
{
  if ( semcall(semaforo, -1) == -1 ) 
    perror("Error en operaci�n P.");
}

void up(int semaforo)
{
  if ( semcall(semaforo, 1) == -1 ) 
    perror("Error en operaci�n V.");
}

int semcall(int semaforo, int operacion)
{
  struct sembuf sb;
  sb.sem_num = 0;
  sb.sem_op = operacion;
  sb.sem_flg = 0;

  return ( semop(semaforo, &sb, 1) ); /*devuelve -1 si error */
}

int borra_s(int semaforo)
{

  if ( semctl(semaforo, 0, IPC_RMID, 0) == -1) {
    perror("Error al eliminar el sem�foro.");
    return -1;
  }
return 0;
}
